package com.kuangstudy.controller.list;

import com.kuangstudy.entity.Product;
import com.kuangstudy.service.list.ProductListService;
import com.kuangstudy.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collections;
import java.util.List;

/**
 * @author 飞哥
 * @Title: 学相伴出品
 * @Description: 我们有一个学习网站：https://www.kuangstudy.com
 * @date 2021/5/25 17:12
 */
@RestController
public class ProductListController {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private ProductListService productListService;

    /**
     * 查询产品信息
     *
     * @param pageNo
     * @param pageSize
     * @return
     */
    @GetMapping("/findproducts")
    public R findProducts(int pageNo, int pageSize) {
        // 1: 计算分页的起始页
        int start = (pageNo - 1) * pageSize;
        // 2：计算分页的结束页
        int end = start + pageSize - 1;
        try {
            // 3: 查询列表中对应的产品信息进行返回
            List<Product> productList = this.redisTemplate.opsForList().range("product:list", start, end);
            // 4: 如果缓存查询不到就去数据库查询
            if (CollectionUtils.isEmpty(productList)) {
                //todo: 查询数据库，存在缓存击穿的情况，大量的并发请求进来，可能把数据库冲
                productList = productListService.findProductsDB();
            }
            // 5: 查询产品集合
            return R.ok().data("products", productList);
        } catch (Exception ex) {
            //todo: 查询数据库，存在缓存击穿的情况，大量的并发请求进来，可能把数据库冲
            return R.error().message("服务器忙!!!");
        }
    }

    /**
     * 查询产品信息
     *
     * @param pageNo
     * @param pageSize
     * @return
     */
    @GetMapping("/findproducts/masterslave")
    public R findProductsmasterslave(int pageNo, int pageSize) {
        // 1: 计算分页的起始页
        int start = (pageNo - 1) * pageSize;
        // 2：计算分页的结束页
        int end = start + pageSize - 1;
        try {
            // 3: 查询列表中对应的产品信息进行返回
            List<Product> productList = this.redisTemplate.opsForList().range("product:list:master", start, end);
            // 4: 如果缓存查询不到就去数据库查询
            if (CollectionUtils.isEmpty(productList)) {
                // todo 存在缓存击穿的情况，就查询缓存B的数据
                productList = this.redisTemplate.opsForList().range("product:list:slave", start, end);
            }
            // 5: 查询产品集合
            return R.ok().data("products", productList);
        } catch (Exception ex) {
            //todo: 查询数据库，存在缓存击穿的情况，大量的并发请求进来，可能把数据库冲
            return R.error().message("服务器忙!!!");
        }
    }
}
